package org2.jogo;

import java.util.ArrayList;
import java.util.List;
import adapters.PerguntasDbAdapter;
import android.database.Cursor;
import org2.jogo.models.Pergunta;
import org2.jogo.models.SetPerguntas;

public class PerguntasGravadas {

	private static final int	FACIL	= 1;
	private static final int	NORMAL	= 2;
	private static final int	DIFICIL	= 3;

	private PerguntasGravadas() {
	}

	/**
	 * Método usado para gerar perguntas de teste, com nomes e respostas padrões.
	 * 
	 * @param numeroPerguntas O número de perguntas a serem geradas
	 */
	public static void gerarPerguntasTeste(PerguntasDbAdapter adapter, int numeroPerguntas) {
		if (!adapter.temPergunta()) {
			for (int i = 0; i < numeroPerguntas; i++) {
				String[] respostas = new String[] { "Alternativa 1", "Alternativa 2", "Resposta 3", "Alternativa 4" };
				Pergunta pergunta = new Pergunta("Pergunta fácil " + i, respostas, 2, FACIL);
				adapter.decoraPergunta(pergunta.getContentValues());
				pergunta = new Pergunta("Pergunta normal " + i, respostas, 2, NORMAL);
				adapter.decoraPergunta(pergunta.getContentValues());
				pergunta = new Pergunta("Pergunta difícil " + i, respostas, 2, DIFICIL);
				adapter.decoraPergunta(pergunta.getContentValues());
			}
		}
	}

	/**
	 * Escolhe aleatoriamente perguntas para determinado jogo, sem repetição
	 * 
	 * @param jogo O SetPerguntas aonde as perguntas serão carregadas
	 */
	public static void escolherPerguntas(PerguntasDbAdapter adapter, SetPerguntas jogo, boolean customizadas)
			throws Exception {
		Cursor c = adapter.getPerguntas(jogo.getDificuldade());
		// Verifica se há perguntas o suficiente gravadas para começar um jogo
		if (c.getCount() < jogo.numeroPerguntas())
			throw new Exception("Não há perguntas suficientes para começar o jogo");
		// Inicializa um vetor que indica quantas e quais perguntas foram
		// escolhidas
		List<Pergunta> perguntas = new ArrayList<Pergunta>();
		c.moveToFirst();
		while (!c.isAfterLast()) {
			Pergunta pergunta = Pergunta.getFromCursor(c);
			if (customizadas || !pergunta.isCustomizada())
				perguntas.add(pergunta);
			c.moveToNext();
		}
		c.close();
		int tamanho = jogo.numeroPerguntas();
		int[] perguntasEscolhidas = new int[tamanho];
		for (int i = 0; i < tamanho; i++) {
			perguntasEscolhidas[i] = -1;
		}
		int numeroEscolhidas = 0;
		// Loop que escolhe as perguntas a serem utilizadas
		while (numeroEscolhidas < tamanho) {
			try {
				int escolhida = (int) (Math.random() * (perguntas.size()));
				if (!jaFoiEscolhida(perguntasEscolhidas, escolhida)) {
					perguntasEscolhidas[numeroEscolhidas++] = escolhida;
				}
			} catch (Exception ex) {}
		}
		// Carrega as perguntas escolhidas no jogo
		for (int i = 0; i < tamanho; i++) {
			jogo.addPergunta(perguntas.get(perguntasEscolhidas[i]));
		}
	}

	/**
	 * Verifica se uma pergunta já foi escolhida
	 * 
	 * @param escolhidas O vetor indicando quais perguntas já foram escolhidas
	 * @param escolhendo Um int indicando a posição na lista global de perguntas da pergunta a ser escolhida
	 * @return True se a pergunta já foi escolhida antes (procurar outra pergunta)
	 */
	private static boolean jaFoiEscolhida(int[] escolhidas, int escolhendo) {
		for (int i = 0; i < escolhidas.length; i++) {
			if (escolhidas[i] == escolhendo)
				return true;
		}
		return false;
	}

	/**
	 * Esse método inicializará todo o banco de perguntas, todas as perguntas devem entrar aqui. Depois de prontas as
	 * perguntas, este método ficará ENORME, a fim de carregar todas as perguntas do jogo.
	 */
	public static void inicializaPerguntas(PerguntasDbAdapter adapter) {
		if (!adapter.temPergunta()) {
			List<Pergunta> perguntas = new ArrayList<Pergunta>();

			/*
			 * Perguntas fáceis
			 */

			perguntas.add(new Pergunta("Qual a função do registrador?", new String[] { "Somar dados", "Subtrair dados",
					"Guardar dados", "Ler dados" }, 2, FACIL));
			perguntas
					.add(new Pergunta(
							"A fim de facilitar a implementação da famosa rede mundial de computadores, a Internet, foi-se criada a arquitetura em camadas. Qual destas não fazem parte das camadas do modelo OSI?",
							new String[] { "Transporte", "Sessão", "Servidor", "Apresentação" }, 2, FACIL));
			perguntas.add(new Pergunta(
					"Ao escrever um programa em Pascal, qual o nível denominado para essa linguagem?", new String[] {
							"Nível de linguagem de montagem", "Nível de sistema operacional",
							"Nível de macroprogramação", "Nível de linguagem orientada para problemas" }, 3, FACIL));
			perguntas
					.add(new Pergunta(
							"Qual dessas técnicas abaixo são usadas para melhorar o desempenho da máquina e usa como modelo as linhas de montagem?",
							new String[] { "Nanoprogramação", "Macroprogramação", "Pipelining", "Circuito Ford" }, 0,
							FACIL));
			perguntas.add(new Pergunta("Quais destas funções a ALU não executa?", new String[] { "A AND B", "A OR B",
					"A", "NOT B" }, 3, FACIL));
			perguntas.add(new Pergunta("Em um processador, quais destas funções o COND não executa?", new String[] {
					"Desvie se N = 1", "Desvie se N = 0", "Desvie sempre", "Não desvie" }, 1, FACIL));
			perguntas
					.add(new Pergunta(
							"Um desvio xxxxxxxx diz para parar de buscar instruções consecutivamente, e ir para algum endereço específico. Qual é esse desvio?",
							new String[] { "Condicional", "Incondicional", "Loop", "Recursão" }, 1, FACIL));
			perguntas.add(new Pergunta(
					"Um desvio xxxxxxx testa alguma condição e desvia se a condição é satisfeita. Qual é esse desvio?",
					new String[] { "Condicional", "Incondicional", "Loop", "Recursão" }, 0, FACIL));
			perguntas.add(new Pergunta("Qual dessas operações é utilizada para empilhar?", new String[] { "STOD",
					"PUSH", "POP", "CALL" }, 1, FACIL));
			perguntas
					.add(new Pergunta(
							"O TCP (acrônimo para o inglês Transmission Control Protocol) é um dos protocolos sob os quais assenta o núcleo da Internet. Ele faz parte de qual camada da Internet?",
							new String[] { "Fisica", "Enlace", "Rede", "Transporte" }, 3, FACIL));
			perguntas.add(new Pergunta("Quais destas funções a ALU não executa?", new String[] { "A AND B", "A OR B",
					"A", "NOT B" }, 3, FACIL));

			/*
			 * Perguntas normais
			 */

			perguntas.add(new Pergunta("Dados um número X = 010 e Y = 110. Combinando esses dois números, obtemos a "
					+ "saída Z = 101. Sendo assim, podemos dizer que a operação feita foi:", new String[] { "X AND Y",
					"X OR Y", "X NAND Y", "NOT X AND Y" }, 2, NORMAL));
			perguntas
					.add(new Pergunta(
							"Um conhecedor de lógica entra em um restaurante e diz: "
									+ "“Eu quero um hamburguer ou um cachorro quente e batatas fritas”. Qual dos seguintes casos não é "
									+ "uma representação válida do pedido?", new String[] { "Somente um hamburguer",
									"Um hamburguer com batatas fritas", "Somente um cachorro quente",
									"Somente batatas fritas" }, 0, NORMAL));
			perguntas.add(new Pergunta("Qual dessas operações é utilizada para empilhar?", new String[] { "STOD",
					"PUSH", "POP", "CALL" }, 1, NORMAL));
			perguntas.add(new Pergunta(
					"Ao escrever um programa em Pascal, qual o nível denominado para essa linguagem?", new String[] {
							"Nível de linguagem de montagem", "Nível de sistema operacional",
							"Nível de macroprogramação", "Nível de linguagem orientada para problemas" }, 3, NORMAL));
			perguntas.add(new Pergunta(
					"Em MIC-1, temos um bit de controle com base na saída corrente da ALU chamado N, "
							+ "o qual é ligado quando a saída da ALU é:", new String[] { "Negativa", "Positiva",
							"Zero", "Nenhuma das alternativas anteriores" }, 0, NORMAL));
			perguntas.add(new Pergunta("Quais destas funções a ALU não executa?", new String[] { "A AND B", "A OR B",
					"A", "NOT B" }, 3, NORMAL));
			perguntas.add(new Pergunta("Em um processador, quais destas funções o COND não executa?", new String[] {
					"Desvie se N = 1", "Desvie se N = 0", "Desvie sempre", "Não desvie" }, 1, NORMAL));
			perguntas.add(new Pergunta("Qual a função do registrador?", new String[] { "Somar dados", "Subtrair dados",
					"Guardar dados", "Ler dados" }, 2, NORMAL));
			perguntas
					.add(new Pergunta(
							"Dos pares de estruturas abaixo, qual par é usado para comunicação com a memória principal?",
							new String[] { "Latch A e Latch B", "MAR e MBR", "AMUX e ALU", "Deslocador e Shifter" }, 1,
							NORMAL));
			perguntas.add(new Pergunta(
					"Na arquitetura MIC-1, usada no curso, quantos sinais de controle possui a AMUX?", new String[] {
							"1", "2", "3", "Nenhum" }, 0, NORMAL));
			perguntas
					.add(new Pergunta(
							"Qual dessas técnicas abaixo são usadas para melhorar o desempenho da máquina e usa como modelo as linhas de montagem?",
							new String[] { "Nanoprogramação", "Macroprogramação", "Pipelining", "Circuito Ford" }, 2,
							NORMAL));
			perguntas
					.add(new Pergunta(
							"Instruções de xxxxxx tipicamente decrementam um contador de interação, e então desviam de volta ao início. Qual é esse desvio?",
							new String[] { "Condicional", "Incondicional", "Loop", "Recursão" }, 2, NORMAL));
			perguntas
					.add(new Pergunta(
							"A fim de facilitar a implementação da famosa rede mundial de computadores, a Internet, foi-se criada a arquitetura em camadas. Qual destas não fazem parte das camadas do modelo OSI?",
							new String[] { "Transporte", "Sessão", "Servidor", "Apresentação" }, 2, NORMAL));

			/*
			 * Perguntas difíceis
			 */

			perguntas.add(new Pergunta(
					"Em MIC-1, temos um bit de controle com base na saída corrente da ALU chamado N, "
							+ "o qual é ligado quando a saída da ALU é:", new String[] { "Negativa", "Positiva",
							"Zero", "Nenhuma das alternativas anteriores" }, 0, DIFICIL));
			perguntas.add(new Pergunta("Quais destas funções a ALU não executa?", new String[] { "A AND B", "A OR B",
					"A", "NOT B" }, 3, DIFICIL));
			perguntas.add(new Pergunta("Em um processador, quais destas funções o COND não executa?", new String[] {
					"Desvie se N = 1", "Desvie se N = 0", "Desvie sempre", "Não desvie" }, 1, DIFICIL));
			perguntas
					.add(new Pergunta(
							"Um desvio xxxxxxxx diz para parar de buscar instruções consecutivamente, e ir para algum endereço específico. Qual é esse desvio?",
							new String[] { "Desvie se N = 1", "Desvie se N = 0", "Desvie sempre", "Não desvie" }, 1,
							DIFICIL));
			perguntas.add(new Pergunta("Qual destes serviços não são providos pelo protocolo TCP?", new String[] {
					"Garantia de temporização", "Transferencia confiavel de dados", "Controle de congestionamento",
					"Controle de fluxo" }, 0, DIFICIL));
			perguntas
					.add(new Pergunta(
							"Em Computação em Nuvem, temos sua arquitetura dividida em camadas. A ferramenta Google Docs faz parte de qual camada?",
							new String[] { "Plataforma", "Infraestrutura", "Aplicação", "Servidor" }, 2, DIFICIL));
			perguntas.add(new Pergunta(
					"Por qual destes motivos muitos clientes ainda não adoram a Computação em Nuvem?", new String[] {
							"Facilidade de manutenção", "Escalabilidade", "Portabilidade", "Segurança" }, 3, DIFICIL));
			perguntas
					.add(new Pergunta(
							"Instruções de xxxxxx tipicamente decrementam um contador de interação, e então desviam de volta ao início. Qual é esse desvio?",
							new String[] { "Condicional", "Incondicional", "Loop", "Recursão" }, 2, DIFICIL));
			perguntas
					.add(new Pergunta(
							"Dos pares de estruturas abaixo, qual par é usado para comunicação com a memória principal?",
							new String[] { "Latch A e Latch B", "MAR e MBR", "AMUX e ALU", "Deslocador e Shifter" }, 1,
							DIFICIL));
			perguntas
					.add(new Pergunta(
							"Um conhecedor de lógica entra em um restaurante e diz: "
									+ "“Eu quero um hamburguer ou um cachorro quente e batatas fritas”. Qual dos seguintes casos não é "
									+ "uma representação válida do pedido?", new String[] { "Somente um hamburguer",
									"Um hamburguer com batatas fritas", "Somente um cachorro quente",
									"Somente batatas fritas" }, 0, DIFICIL));
			perguntas
					.add(new Pergunta(
							"O TCP (acrônimo para o inglês Transmission Control Protocol) é um dos protocolos sob os quais assenta o núcleo da Internet. Ele faz parte de qual camada da Internet?",
							new String[] { "Fisica", "Enlace", "Rede", "Transporte" }, 3, DIFICIL));

			// Carregando as perguntas no banco de dados
			for (Pergunta pergunta : perguntas) {
				adapter.decoraPergunta(pergunta.getContentValues());
			}
		}
	}
}
